﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Persistencia_y_capa_de_negocio;

namespace clonegame
{
    public partial class formularioUnidadEditarCostes : Form
    {
        // Nombre del edificio.
        private string nombreUnidad;
        public string NombreUnidad
        {
            get { return nombreUnidad; }
            set
            {
                nombreUnidad = value;
                RellenaDGV(false);
            }
        }

        // Indica desde dónde se está realizando el drag & drop.
        private int desdeDrag;

        // Enteros que codifican el origen del drag & drop.
        private const int NINGUNO = 0;
        private const int DISPONIBLES = 1;
        private const int GENERADAS = 2;


        public formularioUnidadEditarCostes()
        {
            InitializeComponent();

            desdeDrag = NINGUNO;

            // Explicación
            labelExplicacion.Text = "Arrastra los recursos disponibles que desées que valga el " + nombreUnidad + ".";
        }

        /// <summary>
        /// Rellena los datagrid con los datos adecuados en cada uno.
        /// </summary>
        /// <param name="nuevo"></param>
        public void RellenaDGV(bool nuevo)
        {
            // ArrayList de recursos generados.
            ArrayList listaRecursosGenerados;

            // ArrayList de recursos disponibles.
            ArrayList listaRecursosDisponibles;

            // Obtenemos los recursos generados por el edificio.
            listaRecursosGenerados = formularioUnidadEditar.Instancia.Un.Costes;

            // Obtenemos la lista de unidades disponibles.
            listaRecursosDisponibles = CADRecurso.Instancia.getRecursosExcepto(listaRecursosGenerados);

            // Limpiamos los dgv.
            dgvRecursosDisponibles.Rows.Clear();
            dgvRecursosGenerados.Rows.Clear();

            // Obtenemos la ruta.
            string mdf = Application.ExecutablePath;
            mdf = mdf.Remove(mdf.LastIndexOf(@"\bin\"));
            string mdf2 = mdf.Remove(mdf.LastIndexOf(@"\clonegame"));
            mdf2 += @"\clonegame\imagenes\recursos\";

            // Mostramos los recursos disponibles.
            try
            {
                int cantidadDisponibles = 0;
                foreach (ENRecurso un in listaRecursosDisponibles)
                {
                    dgvRecursosDisponibles.Rows.Add(1);
                    try
                    {
                        dgvRecursosDisponibles.Rows[cantidadDisponibles].Cells[0].Value = System.Drawing.Image.FromFile(mdf2 + un.Nombre + ".png");
                    }
                    catch (Exception)
                    {
                        dgvRecursosDisponibles.Rows[cantidadDisponibles].Cells[0].Value = clonegame.Properties.Resources.RecursoNoEncontrado;
                    }
                    dgvRecursosDisponibles.Rows[cantidadDisponibles].Cells[1].Value = un.Nombre.ToString();
                    cantidadDisponibles++;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            // Mostramos las unidades generadas.
            try
            {
                int cantidadGeneradas = 0;
                foreach (int nombre in listaRecursosGenerados)
                {
                    dgvRecursosGenerados.Rows.Add(1);
                    string nom = CADRecurso.Instancia.getNombreRecurso(nombre).Trim();
                    try
                    {
                        dgvRecursosGenerados.Rows[cantidadGeneradas].Cells[0].Value = System.Drawing.Image.FromFile(mdf2 + nom + ".png");
                    }
                    catch (Exception)
                    {
                        dgvRecursosGenerados.Rows[cantidadGeneradas].Cells[0].Value = clonegame.Properties.Resources.RecursoNoEncontrado;
                    }
                    dgvRecursosGenerados.Rows[cantidadGeneradas].Cells[1].Value = CADRecurso.Instancia.getNombreRecurso(nombre);
                    cantidadGeneradas++;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        /// <summary>
        /// Evento que se lanza cuando se pulsa el ratón sobre el dgv de recursosDisponibles. Se encarga de seleccionar la fila sobre la
        /// que se encuentra el ratón la prepara para el drag & drop. También indica que se está realizando desde disponibles.
        /// </summary>
        /// <param name="sender">Control que envía la acción.</param>
        /// <param name="e">Parámetros.</param>
        private void dgvRecursosDisponibles_MouseDown(object sender, MouseEventArgs e)
        {
            // Indicamos que el drag&drop se está realizando desde disponibles.
            desdeDrag = DISPONIBLES;

            // Obtenemos el indice de la fila sobre la que se ha pulsado.
            int indice = dgvRecursosDisponibles.HitTest(e.X, e.Y).RowIndex;
            if (dgvRecursosDisponibles.SelectedRows.Count > 0)
            {
                dgvRecursosDisponibles.SelectedRows[0].Selected = false;    // Deseleccionamos la anterior y seleccionamos la nueva.
            }

            

            // Si el indice es correcto iniciamos el drag & drop.
            if (indice > -1)
            {
                dgvRecursosDisponibles.Rows[indice].Selected = true;        // Supuestamente esto hará que seleccione al pelico.
                dgvRecursosDisponibles.DoDragDrop(indice, DragDropEffects.Move);
            }
        }

        /// <summary>
        /// Establece el efecto del drag&drop a Move cuando se desplaza sobre el dgv.
        /// </summary>
        /// <param name="sender">Control que envía la acción.</param>
        /// <param name="e">Parámetros.</param>
        private void dgvRecursosDisponibles_DragOver(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Move;
        }

        /// <summary>
        /// Realiza el movimiento de los recursos desde el DGV de generados al de disponibles.
        /// </summary>
        /// <param name="sender">Control que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void dgvRecursosDisponibles_DragDrop(object sender, DragEventArgs e)
        {
            // Comprobamos si viene desde el otro DGV.
            if (desdeDrag == GENERADAS)
            {
                try
                {
                    // Eliminamos cada una de las unidades que a partir de este momento no serán disponibles.
                    foreach (DataGridViewRow r in dgvRecursosGenerados.SelectedRows)
                    {
                        ENRecurso un = CADRecurso.Instancia.getRecurso(r.Cells[1].Value.ToString());
                        string nombre = CADRecurso.Instancia.getNombreRecurso(un.Id);
                        formularioUnidadEditar.Instancia.lbCostes.Items.Remove(nombre);
                        formularioUnidades.Instancia.Estado = "editando";
                        formularioUnidadEditar.Instancia.Un.Costes.Remove(un.Id);
                    }

                    // Actualizamos el DGV.
                    RellenaDGV(false);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

            // Ha finalizado el drag & drop.
            desdeDrag = NINGUNO;
        }

        /// <summary>
        /// Evento que se lanza cuando se pulsa el ratón sobre el dgv de unidades generadas. Se encarga de seleccionar la fila sobre la
        /// que se encuentra el ratón la prepara para el drag & drop. También indica que se está realizando desde generadas.
        /// </summary>
        /// <param name="sender">Control que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void dgvRecursosGenerados_MouseDown(object sender, MouseEventArgs e)
        {
            // Indicamos que el drag&drop se está realizando desde disponibles.
            desdeDrag = GENERADAS;

            // Obtenemos el indice de la fila sobre la que se ha pulsado.
            int indice = dgvRecursosGenerados.HitTest(e.X, e.Y).RowIndex;

            if (dgvRecursosGenerados.SelectedRows.Count > 0)
            {
                dgvRecursosGenerados.SelectedRows[0].Selected = false;    // Deseleccionamos la anterior y seleccionamos la nueva.
            }

            
            // Si el indice es correcto iniciamos el drag & drop.
            if (indice > -1)
            {
                dgvRecursosGenerados.Rows[indice].Selected = true;        // Supuestamente esto hará que seleccione al pelico.
                dgvRecursosGenerados.DoDragDrop(indice, DragDropEffects.Move);
            }
        }

        /// <summary>
        /// Establece el efecto del drag&drop a Move cuando se desplaza sobre el dgv.
        /// </summary>
        /// <param name="sender">Control que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void dgvRecursosGenerados_DragOver(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Move;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender">Control que envía la acción.</param>
        /// <param name="e">Argumentos.</param>
        private void dgvRecursosGenerados_DragDrop(object sender, DragEventArgs e)
        {
            // Comprobamos que viene desde el otro DGV.
            if (desdeDrag == DISPONIBLES)
            {
                try
                {
                    // Eliminamos cada una de las unidades que a partir de este momento no serán disponibles.
                    foreach (DataGridViewRow r in dgvRecursosDisponibles.SelectedRows)
                    {
                        formularioUnidades.Instancia.Estado = "editando";
                        ENRecurso un = CADRecurso.Instancia.getRecurso(r.Cells[1].Value.ToString());
                        formularioUnidadEditar.Instancia.Un.Costes.Add(un.Id);
                        string nombre = CADRecurso.Instancia.getNombreRecurso(un.Id);
                        formularioUnidadEditar.Instancia.lbCostes.Items.Add(nombre);
                    }

                    // Actualizamos el DGV.
                    RellenaDGV(false);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

            // Ha finalizado el drag & drop.
            desdeDrag = NINGUNO;
        }
    }
}
